﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;

namespace DynaSpace.Menu
{
	/// <summary>
	/// Textové tlačítko v menu
	/// </summary>
	public class MenuButton : MenuItem
	{
		private Action<MenuButton> onClick;

		/// <summary>
		/// Konstruktor <see cref="MenuButton"/>
		/// </summary>
		/// <param name="text">Text tlačítka</param>
		public MenuButton(string text)
		{
			this.Height = 20;
			this.CanFocus = true;
			this.Visible = true;
			this.Text = text;
		}

		/// <summary>
		/// Konstruktor <see cref="MenuButton"/> s definicí akce po kliknutí
		/// </summary>
		/// <param name="text">Text tlačítka</param>
		/// <param name="onClick">Akce po kliknutí</param>
		public MenuButton(string text, System.Action<MenuButton> onClick)
			:this(text)
		{
			this.onClick = onClick;
		}

		/// <summary>
		/// Konstruktor <see cref="MenuButton"/> s definicí akce po kliknutí
		/// </summary>
		/// <param name="text">Text tlačítka</param>
		/// <param name="onClick">Akce po kliknutí</param>
		public MenuButton(string text, System.Action onClick)
			: this(text)
		{
			this.onClick = new Action<MenuButton>((mb) => onClick.Invoke());
		}

		/// <summary>
		/// Updatuje stav tlačítka
		/// </summary>
		/// <param name="upateTime">Čas hry</param>
		/// <param name="data"><see cref="MenuItemUpdateData">Data</see> menu</param>
		public override void Update(Microsoft.Xna.Framework.GameTime upateTime, MenuItemUpdateData data)
		{
			// pokud je focus na tomto tlačítku
			if (data.ItemWithFocus == this)
			{
				// a pokud má menu ve kterém tlačítko je focus a pokud se stiskla klávesa akce
				if (data.Menu.HaveFocus && DynaGame.Game.IsKeyPressedOnce(PlayerIndex.One, DynaSpace.Input.PlayerButton.Action))
				{
					// vyvoláme event
					OnClick();
				}
			}
		}

		/// <summary>
		/// Vykreslí ovládací prvek
		/// </summary>
		/// <param name="spriteBatch">Sprite batch pro vykreslování</param>
		/// <param name="position">Pozice vykreslování</param>
		/// <param name="data">Informace o aktuálním focusu a menu</param>
		public override void Draw(SpriteBatch spriteBatch, Vector2 position, MenuItemUpdateData data)
		{
			spriteBatch.DrawString(ContentComponent.verdana10, Text, position, data.ItemWithFocus == this ? Color.Yellow : Color.DarkBlue);
		}

		/// <summary>
		/// Vrací nebo nastavuje nadpis tlačítka
		/// </summary>
		public string Text
		{
			get;
			set;
		}

		/// <summary>
		/// Vyvolá se při vyvolání volby v menu
		/// </summary>
		public event EventHandler Click;

		/// <summary>
		/// Vyvolá událost kliknutí a případně akci předanou v konsturktoru
		/// </summary>
		protected void OnClick()
		{
			if (onClick != null)
				onClick.Invoke(this);

			if (Click != null)
				Click.Invoke(this, new EventArgs());
		}
	}
}
